package com.jeff.test;

import com.jeff.meta.model.Soldier;

import java.util.ArrayList;
import java.util.List;

/**
 * 使用面向对象的方式来解构问题 使之通俗易懂
 * {@Description} 说明
 * {@Author} <b style="color:yellow">yaojianfeng</b> 2024/7/2 下午10:56
 */
public class MinimumBullets {
    public static void main(String[] args) {
        int[] scores1 = {1, 0, 2};
        int[] scores2 = {1, 2, 2};
        int[] scores3 = {1, 3, 2};
        int[] scores4 = {1, 2, 3, 4, 5, 5, 5, 3, 1};
        System.out.println(sumBullets(checkBullets(setBullets(scores1))));
        System.out.println(sumBullets(checkBullets(setBullets(scores2))));
        System.out.println(sumBullets(checkBullets(setBullets(scores3))));
        System.out.println(sumBullets(checkBullets(setBullets(scores4))));

    }

    /**
     * 模拟 初始状态 每个士兵都知道自己的评分和位置，以及初始子弹数 并且知道自己的左右士兵的情况
     *
     * @param scores 分数列表
     * @return 士兵列表
     */
    public static List<Soldier> getSoldierList(int[] scores) {
        ArrayList<Soldier> soldiers = new ArrayList<>(scores.length);
        for (int i = 0; i < scores.length; i++) {
            soldiers.add(new Soldier(scores[i], i, 1));
        }
        for (int i = 0; i < soldiers.size(); i++) {
            Soldier soldier = soldiers.get(i);
            if (i == 0) {
                soldier.setLeftSoldier(soldiers.get(i + 1));
                soldier.setRightSoldier(soldiers.get(i + 1));
            } else if (i == soldiers.size() - 1) {
                soldier.setLeftSoldier(soldiers.get(i - 1));
                soldier.setRightSoldier(soldiers.get(i - 1));
            } else {
                soldier.setLeftSoldier(soldiers.get(i - 1));
                soldier.setRightSoldier(soldiers.get(i + 1));
            }
        }
        return soldiers;
    }


    /**
     * 设置士兵的子弹数
     *
     * @param scores 分数列表
     */
    public static List<Soldier> setBullets(int[] scores) {
        List<Soldier> soldiers = getSoldierList(scores);
        // 设置士兵的子弹数
        for (Soldier soldier : soldiers) {
            //查看当前士兵的评分是否比左右士兵的评分高
            if (soldier.getScore() > soldier.getLeftSoldier().getScore() || soldier.getScore() > soldier.getRightSoldier().getScore()) {
                //如果符合条件,则子弹数应该比左右士兵中分数较少的那个多1
                if (soldier.getLeftSoldier().getScore() < soldier.getRightSoldier().getScore()) {
                    soldier.setBullets(soldier.getLeftSoldier().getBullets() + 1);
                } else {
                    soldier.setBullets(soldier.getRightSoldier().getBullets() + 1);
                }
            }
        }
        return soldiers;
    }

    /**
     * 教官检查确认 是否所有士兵的子弹数符合规则,如果不符合规则,则进行补偿1颗子弹
     *
     * @param soldiers 士兵列表
     * @return 新的士兵列表
     */
    public static List<Soldier> checkBullets(List<Soldier> soldiers) {
        for (Soldier current : soldiers) {
            //规则: 每个士兵都会检查自己左右士兵的分数,确保比自己分数低的士兵的子弹数要小于自己的子弹数,如果不符合这条规则,则自己的子弹数应该+1
            if (current.getLeftSoldier().getScore() < current.getScore() && current.getLeftSoldier().getBullets() >= current.getBullets()) {
                current.setBullets(current.getBullets() + 1);
            }
            if (current.getRightSoldier().getScore() < current.getScore() && current.getRightSoldier().getBullets() >= current.getBullets()) {
                current.setBullets(current.getBullets() + 1);
            }
        }
        return soldiers;
    }

    /**
     * 计算所有士兵子弹之和
     *
     * @param soldiers 士兵列表
     * @return 最少子弹数
     */
    public static int sumBullets(List<Soldier> soldiers) {
        int sum = 0;
        for (Soldier soldier : soldiers) {
            System.out.print(soldier.getBullets() + ", ");
            sum += soldier.getBullets();
        }
        return sum;
    }
}
